//创建一个日期类
#include<iostream>
using std::cout;
using std::endl;
class Data
{
public:
	//获取某年某月的天数
	int GetMonthday(int year,int month)
	{
		 static int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//static作用为只在这里调用一次，之后都不会再调用
		int day = days[month];
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
		{
			day += 1;
		}
		return day;
	}
	//显式的构造函数,初始化的作用，全缺省的构造函数
	Data(int year = 1990,int month=1,int day=1)
	{
		if (year >= 0 && month >= 1 && month <= 12 && day >= 1 && day <= GetMonthday(year, month))
		{
			_year = year;
			_month = month;
			_day = day;
		}
		else
		{
			cout << "非法输入" << endl;
		}
	}
//拷贝构造函数是构造函数的一个重载形式
	Data(const Data& d)//必须传引用，不然会陷入无穷递归，const锁定防止下面的赋值写错发生错误。
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
//判断两个日期是否相等
//运算符重载，运算符有几个操作数，operator重载的函数就有几个操作数
	bool operator==( const Data& d)//这里会被编译器直接译operator(Data* this,Data &d),会被编成this->_year==d._year
	{
		return _year == d._year
			&& _month == d._month
			&& _day== d._day;
	}
////判断大于一
//	bool operator>(const Data& d)
//	{
//		if (_year > d._year)
//			return true;
//		else if (_year == d._year && _month > d._month)
//			return true;
//		else if (_year == d._year && _month == d._month && _day > d._day)
//			return true;
//		else
//			return false;																																																													
//	}
	//判断小于
	bool operator<(const Data& d)
	{
		if (_year < d._year)
			return true;
		else if (_year == d._year && _month < d._month)
			return true;
		else if (_year == d._year && _month == d._month && _day < d._day)
			return true;
		else
			return false;
	}
	//判断小于等于
	bool operator<=(const Data& d)
	{
		return *this < d || *this == d;//这里比较的话会直接调用上面的函数
	}
	//判断大于二
	bool operator>(const Data& d)
	{
		return !(*this <= d);//逻辑取反
	}
	//判断大于等于
	bool operator>=(const Data& d)
	{
		return *this > d || *this == d;
    }
	//判断不等于
	bool operator!=(const Data& d)
	{
		return !(*this == d);
	}
	//日期加上天数,+
	Data operator+(int days)
	{
		Data ret(*this);//拷贝构造一个ret,因为这不是+=，所以原来的数不能动
		ret._day += days;//先把天数加到上面
		while (ret._day > GetMonthday(ret._year, ret._month))
		{
			ret._day -= GetMonthday(ret._year, ret._month);
			ret._month++;
			if (ret._month == 13)
			{
				ret._year++;
				ret._month = 1;
			}
		}
		return ret;
	}
	//日期加上天数，+=
	Data& operator+=(int days)//这里为什么要用引用
	{
		_day += days;
		while (_day > GetMonthday(_year, _month))
		{
			_day -= GetMonthday(_year, _month);
			_month++;
			if (_month == 13)
			{
				_year++;
				_month = 1;
			}
		}
		return *this;
	}
	//日期-日期
	Data operator-(int days)
	{
		Data ret(*this);//拷贝函数
		ret._day -= days;
		while (ret._day < 1)
		{
			ret._month -= 1;
			if (ret._month == 0)
			{
				ret._year--;
				ret._month = 12;
			}
			ret._day += GetMonthday(ret._year, ret._month);
		}
		return ret;
	}
	Data& operator-=(int days)
	{
		_day -= days;
		while (_day < 1)
		{
			_month -= 1;
			if (_month == 0)
			{
				_year--;
				_month = 12;
			}
			_day += GetMonthday(_year, _month);
		}
		return *this;
	}
	////前置--
	//Data& operator--(int)
	//{

	//}
	////前置++
	//Data& operator++(int)
	//{

	//}
	////后置++
	//Data operator++()
	//{

	//}
	////后置--
	//Data operator--()
	//{

	//}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
//bool operator==(const Data& d1, const Data& d2)//运算符重载放在外面需要类成员变量公有，要不然调不到，要么就将该函数放在类中
//{
//	return d1._year == d2._year
//		&& d1._month == d2._month
//		&& d1._day == d2._day;
//}
int main()
{
	Data d1;
	d1.Print();

	Data d2(2023,5,7);
	Data d3(2023, 6, 7);
	d3.Print();
	d2.Print();
	cout << (d2.operator==(d3)) << endl;
	

	//d1 == d2;//这是运算符重载在类外面时的用法，编译器会自动转换成operator（d1,d2）
	return 0;
}